From: Jan Beulich Date: Thu, 26 Mar 2015 10:24:15 +0000 (+0100) Subject: x86: make atomic bitops consistent with non-atomic ones X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3518 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=7112e580f000605b130507eb3037da245b2922cd;p=xen.git x86: make atomic bitops consistent with non-atomic ones - use int instead of long pointers (matching the 'l' suffix on insns) - use "+m" instead or a pair of "=m" and "m" in asm() constraints Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/include/asm-x86/bitops.h b/xen/include/asm-x86/bitops.h index 97817dbd07..ff43a98fd7 100644 --- a/xen/include/asm-x86/bitops.h +++ b/xen/include/asm-x86/bitops.h @@ -17,8 +17,8 @@ * modified. */ -#define ADDR (*(volatile long *) addr) -#define CONST_ADDR (*(const volatile long *) addr) +#define ADDR (*(volatile int *) addr) +#define CONST_ADDR (*(const volatile int *) addr) extern void __bitop_bad_size(void); #define bitop_bad_size(addr) (sizeof(*(addr)) < 4) @@ -35,10 +35,8 @@ extern void __bitop_bad_size(void); */ static inline void set_bit(int nr, volatile void *addr) { - asm volatile ( - "lock; btsl %1,%0" - : "=m" (ADDR) - : "Ir" (nr), "m" (ADDR) : "memory"); + asm volatile ( "lock; btsl %1,%0" + : "+m" (ADDR) : "Ir" (nr) : "memory"); } #define set_bit(nr, addr) ({ \ if ( bitop_bad_size(addr) ) __bitop_bad_size(); \ @@ -72,10 +70,8 @@ static inline void __set_bit(int nr, void *addr) */ static inline void clear_bit(int nr, volatile void *addr) { - asm volatile ( - "lock; btrl %1,%0" - : "=m" (ADDR) - : "Ir" (nr), "m" (ADDR) : "memory"); + asm volatile ( "lock; btrl %1,%0" + : "+m" (ADDR) : "Ir" (nr) : "memory"); } #define clear_bit(nr, addr) ({ \ if ( bitop_bad_size(addr) ) __bitop_bad_size(); \ @@ -129,10 +125,8 @@ static inline void __change_bit(int nr, void *addr) */ static inline void change_bit(int nr, volatile void *addr) { - asm volatile ( - "lock; btcl %1,%0" - : "=m" (ADDR) - : "Ir" (nr), "m" (ADDR) : "memory"); + asm volatile ( "lock; btcl %1,%0" + : "+m" (ADDR) : "Ir" (nr) : "memory"); } #define change_bit(nr, addr) ({ \ if ( bitop_bad_size(addr) ) __bitop_bad_size(); \ @@ -151,10 +145,8 @@ static inline int test_and_set_bit(int nr, volatile void *addr) { int oldbit; - asm volatile ( - "lock; btsl %2,%1\n\tsbbl %0,%0" - : "=r" (oldbit), "=m" (ADDR) - : "Ir" (nr), "m" (ADDR) : "memory"); + asm volatile ( "lock; btsl %2,%1\n\tsbbl %0,%0" + : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory"); return oldbit; } #define test_and_set_bit(nr, addr) ({ \ @@ -198,10 +190,8 @@ static inline int test_and_clear_bit(int nr, volatile void *addr) { int oldbit; - asm volatile ( - "lock; btrl %2,%1\n\tsbbl %0,%0" - : "=r" (oldbit), "=m" (ADDR) - : "Ir" (nr), "m" (ADDR) : "memory"); + asm volatile ( "lock; btrl %2,%1\n\tsbbl %0,%0" + : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory"); return oldbit; } #define test_and_clear_bit(nr, addr) ({ \ @@ -261,10 +251,8 @@ static inline int test_and_change_bit(int nr, volatile void *addr) { int oldbit; - asm volatile ( - "lock; btcl %2,%1\n\tsbbl %0,%0" - : "=r" (oldbit), "=m" (ADDR) - : "Ir" (nr), "m" (ADDR) : "memory"); + asm volatile ( "lock; btcl %2,%1\n\tsbbl %0,%0" + : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory"); return oldbit; } #define test_and_change_bit(nr, addr) ({ \